/*
 * joueur.c
 *
 *  Created on: Apr 17, 2011
 *      Author: gorus
 */


#include "joueur.h"
#include <malloc.h>




joueur allouer_joueur(joueur j){
	j.nom = (char *) malloc(100*sizeof(char));
	j.vitesse = (double *) malloc(sizeof(double));
	j.saut = (int *) malloc(sizeof(int));
	j.direction = (int *) malloc(sizeof(int));
	j.pos_x = (double *) malloc(sizeof(double));
	j.pos_y = (double *) malloc(sizeof(double));
	j.ensaut = (int *) malloc(sizeof(int));
	j.pos_y0 = (double *) malloc(sizeof(double));
	j.mort = (int *) malloc(sizeof(int)) ;
	j.bonus = (int*) malloc(sizeof(int)) ;
	j.images_perso = (BITMAP**) malloc((NB_POSITION_PERSO)*sizeof(BITMAP**)) ;
	j.pied_en_lair = (int*) malloc(sizeof(int)) ;
	j.est_freestyle = (int*) malloc(sizeof(int)) ;
	return j;
}

void liberer_joueur(joueur j){
	free(j.nom);
	free(j.vitesse);
	free(j.saut);
	free(j.direction);
	free(j.pos_x);
	free(j.pos_y);
	free(j.ensaut);
	free(j.pos_y0);
	free(j.mort) ;
	free(j.bonus) ;
	free(j.images_perso);
	free(j.pied_en_lair) ;
	free(j.est_freestyle) ;
}

joueur init_joueur(){
	joueur j;
	j = allouer_joueur(j);
	*j.vitesse = 1;
	*j.saut = 95;
	*j.direction = DROITE;
	*j.pos_x = 3*TAILLE_BLOC;
	*j.pos_y = TAILLE_BLOC*(NB_BLOCS_HAUTEUR-3);
	*j.ensaut = 0;
	*j.mort = 0 ;
	*j.bonus = 0 ;
	*j.pied_en_lair = 0 ;
	*j.est_freestyle = 0 ;
	j.images_perso[0] = load_bitmap("./images/new/mario_droite.bmp",NULL);
	j.images_perso[1] = load_bitmap("./images/new/mario_gauche.bmp",NULL);
	j.images_perso[2] = load_bitmap("./images/new/mario_droite2.bmp",NULL) ;
	j.images_perso[4] = load_bitmap("./images/new/bomb.bmp",NULL) ;
	j.images_perso[3] = load_bitmap("./images/new/mario_gauche2.bmp",NULL) ;

	return j;
}

/*
void sauter(joueur j){
	int t = 0;
	double pos_x0 = *j.pos_x;
	double pos_y0 = *j.pos_y;
	(*j.pos_y)--;
	switch(*j.direction){
	case GAUCHE :
		while (*j.pos_y<pos_y0){
			t++;
 *j.pos_x = (-(*j.vitesse)*t)/30 + pos_x0;
 *j.pos_y = -((-0.5*g*t*t)/(30*30) + ((*j.saut)*t/30)) + pos_y0;
		}
		break;
	case NODIR :
		while (*j.pos_y<pos_y0){
			t++;
 *j.pos_y = -((-0.5*g*t*t)/(30*30) + ((*j.saut)*t/30)) + pos_y0;
		}
		break;
	case DROITE :
		while (*j.pos_y<pos_y0){
			t++;
 *j.pos_x = ((*j.vitesse)*t)/30 + pos_x0;
 *j.pos_y = -((-0.5*g*t*t)/(30*30) + ((*j.saut)*t/30)) + pos_y0;
		}
		break;
	}
}
 */

void deplacer_droite(joueur j){
	*j.pos_x = (*j.pos_x) + (*j.vitesse);

	if (*j.pied_en_lair==0) {
		*j.pied_en_lair = 1 ;
	}
	else if (*j.pied_en_lair==1) {
		*j.pied_en_lair = 0 ;
	}
}

void deplacer_gauche(joueur j){
	*j.pos_x = (*j.pos_x) - (*j.vitesse);
	if (*j.pied_en_lair==0) {
		*j.pied_en_lair = 1 ;
	}
	else if (*j.pied_en_lair==1) {
		*j.pied_en_lair = 0 ;
	}
}

void gravite(joueur j, int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR]){
	if ((*j.pos_y <= (NB_BLOCS_HAUTEUR)*TAILLE_BLOC) && (collision_bas_tous(j,carte))!=1){
		(*j.pos_y) +=0.4;
	}
}

void afficher_joueur(joueur j, BITMAP* buffer, char carte[LONGEUR_NIVEAU][NB_BLOCS_LARGEUR],int decalage) {

	BITMAP** sprites = j.images_perso ;
	BITMAP* sprite;
	switch(*j.direction){
	case GAUCHE :
		if (*j.pied_en_lair==0) {
			sprite = sprites[3] ;

		}
		else if (*j.pied_en_lair==1) {
			sprite = sprites[1];

		}

		break;
	case DROITE :

		if (*j.pied_en_lair==0) {
			sprite = sprites[2] ;

		}
		else if (*j.pied_en_lair==1) {
			sprite = sprites[0] ;

		}

		break;
	case NODIR :
		sprite = sprites[0];
		break;
	}


	if (collision_toute_tous_explosif(j, carte)==1 || collision_toute_tous_pic(j, carte)==1) {
		*j.mort =1 ;
		sprite = sprites[4] ;

	}
	if (*j.pos_x<0+decalage+LARGEUR_PIC_GAUCHE) {
		*j.mort =1 ;
		sprite = sprites[4] ;
	}

	// collision_toute(int posx1, int posy1, int h1, int l1, int posx2, int posy2, int h2, int l2)
	/*
	int i ;
	for (i=0;i<NB_EXPLOSION;i++) {
		if (collition_toute(*j.pos_x,*j.pos_y, HAUTEUR_JOUEUR, LARGEUR_JOUEUR,*tab1[i].pos_x,*tab1[i].pos_y,HAUTEUR_EXPLOSION,LARGEUR_EXPLOSION )){
	 *j.mort = 1 ;
			sprite = sprites[3] ;
		}
	}*/

	if (collision_toute_tous_bonus(j,carte)==1) {
		//*j.saut = *j.saut + rand()%*j.saut;
		//*j.vitesse = *j.vitesse+2;
		*j.bonus ++;
	}
	if (*j.est_freestyle==0) {

		draw_sprite(buffer,sprite, (int) *j.pos_x, (int) *j.pos_y);

	}
	else if (*j.est_freestyle==1){
		rotate_sprite(buffer,sprite, (int) *j.pos_x, (int) *j.pos_y, ftofix(4**j.pos_y));

	}

}



int collision_droite(int posx1, int posy1, int h1, int l1, int posx2, int posy2, int h2, int l2) {
	int res = 0;
	if (posx1 < posx2){
		if(posx1 + (l1) >= posx2 -1){
			if((posy1 + h1 >= posy2) && (posy1 <= posy2 + h2)){
				res = 1;
			}
		}
	}
	return res;
}

int collision_gauche(int posx1, int posy1, int h1, int l1, int posx2, int posy2, int h2, int l2){
	int res = 0;
	if (posx1 > posx2){
		if(posx1 <= posx2 + (l2) + 1){
			if((posy1 + h1 >= posy2) && (posy1 <= posy2 + h2)){
				res = 1;
			}
		}
	}
	return res;
}

int collision_haut(int posx1, int posy1, int h1, int l1, int posx2, int posy2, int h2, int l2){
	int res = 0;
	if (posy1 > posy2){
		if(posy1 <= posy2 + (h2) + 1){
			if((posx1 + (l1) >= posx2) && (posx2 + (l2) >= posx1)){
				res = 1;
			}
		}
	}
	return res;
}

int collision_bas(int posx1, int posy1, int h1, int l1, int posx2, int posy2, int h2, int l2){
	int res = 0;
	if (posy1 < posy2){
		if(posy1 + (h1) >= posy2 - 1){
			if((posx1 + (l1) >= posx2) && (posx2 + (l2) >= posx1)){
				res = 1;
			}
		}
	}
	return res;
}

int collision_toute(int posx1, int posy1, int h1, int l1, int posx2, int posy2, int h2, int l2){
	if (collision_bas(posx1,posy1,h1,l1,posx2,posy2,h2,l2)==1) {
		return 1 ;
	}
	if (collision_haut(posx1,posy1,h1,l1,posx2,posy2,h2,l2)==1) {
		return 1 ;
	}
	if (collision_gauche(posx1,posy1,h1,l1,posx2,posy2,h2,l2)==1) {
		return 1 ;
	}
	if (collision_droite(posx1,posy1,h1,l1,posx2,posy2,h2,l2)==1) {
		return 1 ;
	}
	return 0 ;
}

int collision_droite_tous(joueur j,char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {

	int res = 0 ;
	int i ;
	int k ;
	for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++) {
		for (k = 0 ; k < LONGEUR_NIVEAU ; k++){
			if (carte[i][k]!='S'){
				if(collision_droite(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR-2,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}
	}
	return res ;
}


int collision_gauche_tous(joueur j,char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {

	int res = 0 ;
	int i ;
	int k ;
	for (i = 0 ; i < NB_BLOCS_HAUTEUR; i++) {
		for (k = 0 ; k < LONGEUR_NIVEAU ; k++){
			if (carte[i][k]!='S'){
				if(collision_gauche(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR-2,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}
	}
	return res ;
}



int collision_haut_tous(joueur j,char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {

	int res = 0 ;
	int i ;
	int k ;
	for (i = 0 ; i < NB_BLOCS_HAUTEUR; i++) {
		for (k = 0 ; k < LONGEUR_NIVEAU ; k++){
			if (carte[i][k]!='S'){
				if(collision_haut(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR-2,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}
	}
	return res ;
}


int collision_bas_tous(joueur j,char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {

	int res = 0 ;
	int i ;
	int k ;
	for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++) {
		for (k = 0 ; k < LONGEUR_NIVEAU ; k++){
			if (carte[i][k]!='S'){
				if(collision_bas(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR-2,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}
	}
	return res ;
}


int collision_toute_tous_explosif(joueur j, char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {
	int res = 0 ;
	int i ;
	int k ;
	for (i=0; i<NB_BLOCS_HAUTEUR;i++) {
		for (k=0; k<LONGEUR_NIVEAU;k++) {
			if (carte[i][k]=='E') {
				if(collision_bas(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
				if(collision_haut(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
				if(collision_droite(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
				if(collision_gauche(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}

	}
	return res ;
}



int collision_toute_tous_pic(joueur j, char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {
	int res = 0 ;
	int i ;
	int k ;
	for (i=0; i<NB_BLOCS_HAUTEUR;i++) {
		for (k=0; k<LONGEUR_NIVEAU;k++) {
			if (carte[i][k]=='P') {
				if(collision_bas(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
				if(collision_haut(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
				if(collision_droite(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
				if(collision_gauche(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}

	}
	return res ;
}

int collision_toute_tous_bonus(joueur j, char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {
	int res = 0 ;
	int i ;
	int k ;
	for (i=0; i<NB_BLOCS_HAUTEUR;i++) {
		for (k=0; k<LONGEUR_NIVEAU;k++) {
			if (carte[i][k]=='B') {
				if(collision_bas(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
				//	carte[i][k] ='S' ;
			//carte[i+1][k] ='M' ;

					return 1;

				}
				if(collision_haut(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					carte[i][k] ='S' ;
					//carte[i+1][k] ='M' ;

					return 1;
				}
				if(collision_droite(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
				//	carte[i][k] ='S' ;
				//	carte[i+1][k] ='M' ;

					return 1;
				}
				if(collision_gauche(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					//carte[i][k] ='S' ;
				//	carte[i+1][k] ='M' ;
					return 1;
				}
			}
		}

	}
	return res ;
}
